package jianzhiOffer;

import org.junit.Test;

/**
 * 13. 机器人的运动范围
 * 地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一格（不能移动到方格外），
 * 也不能进入行坐标和列坐标的数位之和大于k的格子。
 * 例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？
 *
 * @author 司松坡
 * @createTime 2023年05月05日
 */
public class Jian13 {

    int res = 0;

    public int movingCount(int m, int n, int k) {
        boolean[][] booleans = new boolean[m][n];
        backtrack(m,n,k,booleans,0,0);
        System.out.println(res);
        return res;
    }

    public void backtrack(int m, int n, int k, boolean[][] booleans, int i, int j) {
        booleans[i][j] = true;
        if (sum(i, j) <= k) {
            res += 1;
        } else {
            return;
        }
        int[][] site = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
        for (int[] sit : site) {
            int newi = i + sit[0];
            int newj = j + sit[1];
            if (newi >= 0 && newi < m && newj >= 0 && newj < n && !booleans[newi][newj]) {
                backtrack(m,n,k,booleans,newi,newj);
            }
        }
    }

    public int sum(int a, int b) {
        int sum = 0;
        while (a != 0) {
            sum += a % 10;
            a = a / 10;
        }
        while (b != 0) {
            sum += b % 10;
            b = b / 10;
        }
        return sum;
    }

    @Test
    public void test(){
        movingCount(4,4,4);
    }
}
